Chart for WPF/Silverlight
DateTime のグループ化
グラフ機能 > グループ化と集計 > DateTime のグループ化

C1Chart コントロールでは、任意のデータ系列に対してカスタム集計を行うことができます。AggregateGroupSelector プロパティに独自のカスタム関数を定義することで、C1Chart コントロールで自在にデータをグループ化できます。たとえば、ある日付フィールドに基づくグループ化を行い、月単位や年単位で値を集計できます。独自の値の範囲やカテゴリを設定して、データポイントをグループ化することもできます。

このトピックは、既に XAML で "C1Chart1" という名前の C1Chart コントロールを作成していることを前提としています。XAML でコントロールを作成する方法については、「クイックスタート」または「概念と主要なプロパティ」を参照してください。

カスタム集計関数を作成するには、まず、集計するデータを作成する必要があります。Value(double)と Date(DateTime)の2つのプロパティを含む簡単なビジネスオブジェクトを作成します。次の例では、このビジネスオブジェクトに SampleItem と名前を付けます。参考のため、このオブジェクトをこのトピックの最後に記載します。

ランダムなデータから成る ObservableCollection を作成します。

C#
コードのコピー
Random rnd = new Random();
ObservableCollection<SampleItem> _items = new ObservableCollection<SampleItem>();
for(int i = 0; i < 400; i++)
{
    _items.Add(new SampleItem { Value = rnd.Next(0, 100), Date = DateTime.Now.AddDays(i) });
}

次に、XYDataSeries を項目のコレクションに連結します。

C#
コードのコピー
//データ系列を構成します
var ds = new XYDataSeries()
{
    ItemsSource = _items,
    ValueBinding = new Binding { Path = new PropertyPath("Value") },
    XValueBinding = new Binding { Path = new PropertyPath("Date") },
    Aggregate = Aggregate.Sum,
   AggregateGroupSelector = GroupSelectorByDate,
    Label = "Sales"
};

上のコードでは、Aggregate と AggregateGroupSelector の2つのキープロパティを設定しました。Aggregate プロパティは、チャートデータの集計に使用する関数を指定します。AggregateGroupSelector プロパティは、データ系列にグループ化選択キーを提供する関数を指定します。ただし、カスタム関数を設定する前に、チャートに系列を追加し、X 軸に日付を表示するように構成します。また、日付が正しく表示されるように、X 軸を IsTime に設定します。

C#
コードのコピー
//チャートを構成します
c1Chart1.BeginUpdate();
c1Chart1.ChartType = ChartType.Column;
//データ系列を追加します
c1Chart1.Data.Children.Add(ds);
//書式を設定した時間軸を使用します
c1Chart1.View.AxisX.IsTime = true;
c1Chart1.View.AxisX.AnnoFormat = "yyyy";
c1Chart1.View.AxisX.UseExactLimits = true;
//スタイルを適用します
c1Chart1.View.AxisX.MajorGridStrokeThickness = 0;
c1Chart1.View.AxisY.MajorGridFill = new SolidColorBrush(Colors.LightGray);
c1Chart1.EndUpdate();

X 軸に日付を表示するには、IsTime プロパティを True に設定する必要があります。年単位でグループ化するため、年を省略しないで表示するように AnnoFormat プロパティを設定しました。

次のコードは、GroupSelectorByDate 関数を定義します。チャートの各データポイントに対してこの関数が呼び出され、そのデータが属するグループが決定されます。

C#
コードのコピー
double GroupSelectorByDate(double x, double y, object o)
 {
     //年を double として返します
     DateTime dt = x.FromOADate();
     //年単位でグループ化するために、日付の年を返します
    //また、AnnoFormat を "yyyy" に設定します
     returnnew DateTime(dt.Year, 1, 1).ToOADate();   
 }

このグループ選択関数は常に3つのパラメータを受け取り、常に double を返します。同じグループに属するデータポイントは、この関数から同じ値を返します。年単位でグループ化しているため、この関数は、年の最初の日に設定された新しい DateTime 値を返します。2014 年に発生する各データポイントは、この関数から同じ日付値(double)を返すため、同じグループに入れられます。

また、月単位でグループ化する場合は、コードを2行変更するだけです。

C#
コードのコピー
double GroupSelectorByDate(double x, double y, object o)
{
    //年を double として返します
    DateTime dt = x.FromOADate(); 
    //月単位でグループ化するために、日付の年と月を返します          
    returnnew DateTime(dt.Year, dt.Month, 1).ToOADate(); 
}

さらに、月が正しく表示されるように、AnnoFormat を変更する必要があります。

C#
コードのコピー
c1Chart1.View.AxisX.AnnoFormat = "MM/yyyy";

生成されるチャートは次の図のようになります。

参考のために、次に SampleItem クラスを示します。

C#
コードのコピー
publicclass SampleItem
    {
        publicdouble Value { get; set; }
        public DateTime Date { get; set; }
    }
関連トピック